//type 类型判断
isString(o) { //是否字符串
	return Object.prototype.toString.call(o).slice(8, -1) === 'String'
}

isNumber(o) { //是否数字
	return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
}

isBoolean(o) { //是否boolean
	return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
}

isFunction(o) { //是否函数
	return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
}

isNull(o) { //是否为null
	return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
}

isUndefined(o) { //是否undefined
	return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
}

isObj(o) { //是否对象
	return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
}

isArray(o) { //是否数组
	return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
}

isDate(o) { //是否时间
	return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
}

isRegExp(o) { //是否正则
	return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
}

isError(o) { //是否错误对象
	return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
}

isSymbol(o) { //是否Symbol函数
	return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
}

isPromise(o) { //是否Promise对象
	return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
}

isSet(o) { //是否Set对象
	return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
}

isFalse(o) {
	if(!o || o === 'null' || o === 'undefined' || o === 'false' || o === 'NaN') return true
	return false
}

isTrue(o) {
	return !this.isFalse(o)
}

isIos() {
	var u = navigator.userAgent;
	if(u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) { //安卓手机
		// return "Android";
		return false
	} else if(u.indexOf('iPhone') > -1) { //苹果手机
		// return "iPhone";
		return true
	} else if(u.indexOf('iPad') > -1) { //iPad
		// return "iPad";
		return false
	} else if(u.indexOf('Windows Phone') > -1) { //winphone手机
		// return "Windows Phone";
		return false
	} else {
		return false
	}
}

isPC() { //是否为PC端
	var userAgentInfo = navigator.userAgent;
	var Agents = ["Android", "iPhone",
		"SymbianOS", "Windows Phone",
		"iPad", "iPod"
	];
	var flag = true;
	for(var v = 0; v < Agents.length; v++) {
		if(userAgentInfo.indexOf(Agents[v]) > 0) {
			flag = false;
			break;
		}
	}
	return flag;
}

browserType() {
	var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
	var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
	var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
	var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
	var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器  
	var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
	var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器
	var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器

	if(isIE) {
		var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
		reIE.test(userAgent);
		var fIEVersion = parseFloat(RegExp["$1"]);
		if(fIEVersion == 7) return "IE7"
		else if(fIEVersion == 8) return "IE8";
		else if(fIEVersion == 9) return "IE9";
		else if(fIEVersion == 10) return "IE10";
		else return "IE7以下" //IE版本过低
	}
	if(isIE11) return 'IE11';
	if(isEdge) return "Edge";
	if(isFF) return "FF";
	if(isOpera) return "Opera";
	if(isSafari) return "Safari";
	if(isChrome) return "Chrome";
}

checkStr(str, type) {
	switch(type) {
		case 'phone': //手机号码
			return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
		case 'tel': //座机
			return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
		case 'card': //身份证
			return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
		case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
			return /^[a-zA-Z]\w{5,17}$/.test(str)
		case 'postal': //邮政编码
			return /[1-9]\d{5}(?!\d)/.test(str);
		case 'QQ': //QQ号
			return /^[1-9][0-9]{4,9}$/.test(str);
		case 'email': //邮箱
			return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
		case 'money': //金额(小数点2位)
			return /^\d*(?:\.\d{0,2})?$/.test(str);
		case 'URL': //网址
			return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
		case 'IP': //IP
			return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
		case 'date': //日期时间
			return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
		case 'number': //数字
			return /^[0-9]$/.test(str);
		case 'english': //英文
			return /^[a-zA-Z]+$/.test(str);
		case 'chinese': //中文
			return /^[\u4E00-\u9FA5]+$/.test(str);
		case 'lower': //小写
			return /^[a-z]+$/.test(str);
		case 'upper': //大写
			return /^[A-Z]+$/.test(str);
		case 'HTML': //HTML标记
			return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
		default:
			return true;
	}

	// 严格的身份证校验
	isCardID(sId) {
		if(!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
			alert('你输入的身份证长度或格式错误')
			return false
		}
		//身份证城市
		var aCity = {
			11: "北京",
			12: "天津",
			13: "河北",
			14: "山西",
			15: "内蒙古",
			21: "辽宁",
			22: "吉林",
			23: "黑龙江",
			31: "上海",
			32: "江苏",
			33: "浙江",
			34: "安徽",
			35: "福建",
			36: "江西",
			37: "山东",
			41: "河南",
			42: "湖北",
			43: "湖南",
			44: "广东",
			45: "广西",
			46: "海南",
			50: "重庆",
			51: "四川",
			52: "贵州",
			53: "云南",
			54: "西藏",
			61: "陕西",
			62: "甘肃",
			63: "青海",
			64: "宁夏",
			65: "新疆",
			71: "台湾",
			81: "香港",
			82: "澳门",
			91: "国外"
		};
		if(!aCity[parseInt(sId.substr(0, 2))]) {
			alert('你的身份证地区非法')
			return false
		}

		// 出生日期验证
		var sBirthday = (sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2))).replace(/-/g, "/"),
			d = new Date(sBirthday)
		if(sBirthday != (d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate())) {
			alert('身份证上的出生日期非法')
			return false
		}

		// 身份证号码校验
		var sum = 0,
			weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
			codes = "10X98765432"
		for(var i = 0; i < sId.length - 1; i++) {
			sum += sId[i] * weights[i];
		}
		var last = codes[sum % 11]; //计算出来的最后一位身份证号码
		if(sId[sId.length - 1] != last) {
			alert('你输入的身份证号非法')
			return false
		}

		return true
	}
}